Coturn: TURN Server in Docker installieren
Ich brauchte kürzlich für ein Update einen funktionierenden TURN Server. Ohne den lief das neue Feature schlicht nicht. Meine erste Idee war bequem. Öffentlichen TURN Server nehmen, fertig. Kostenlose Basisversion, 20 GB Traffic im Monat, klang ausreichend.
War es nicht.
Ich hatte Verbindungsabbrüche, Timeouts und merkwürdige Reconnects. Mehrere Stunden Debugging später, inklusive Tests mit einem Server eines Freundes, stand fest: Die Ursache lag nicht in der Anwendung. Der externe Dienst war schlicht unzuverlässig. Also blieb nur die Variante, die ich eigentlich vermeiden wollte: selbst einen TURN Server betreiben.
🔁 Warum ich mich für einen eigenen TURN Server entschieden habe
Der Hauptvorteil war Stabilität und Kontrolle. Sobald WebRTC über Relay laufen muss, bist du komplett vom TURN abhängig.
Ich habe mich deshalb für coturn entschieden. Schlank, bewährt und vor allem ohne Datenbank nutzbar. Für viele Anwendungsfälle reicht das völlig.
Überraschung: Die Einrichtung war deutlich einfacher als erwartet.
🧩 Voraussetzungen
Bevor es losgeht, brauchst du natürlich eine funktionierende Docker-Umgebung.
Wenn du Docker noch nicht installiert hast, findest du hier eine Schritt-für-Schritt-Anleitung, wie du das auf Ubuntu mit einem Script erledigst:
Sobald Docker läuft, kann es direkt weitergehen.
🔥 Firewall vorbereiten
Da ich den Container im Host-Modus betreibe, müssen die Ports direkt auf dem Host offen sein:
sudo ufw allow 3478/tcp comment "Coturn STUN/TURN TCP" sudo ufw allow 3478/udp comment "Coturn STUN/TURN UDP" sudo ufw allow 49160:49200/udp comment "Coturn TURN UDP Media Range"
Damit ist der Relay-Portbereich für Medienstreams erreichbar. Ohne den Bereich funktioniert TURN zwar scheinbar, aber Medien kommen nie an.
🐳 Docker Compose für coturn
Im Projektordner habe ich einen Ordner erstellt und darin die docker-compose.yaml angelegt:
---
services:
coturn-app:
image: coturn/coturn:4.6
container_name: coturn-app
hostname: turn1.techniverse.net
restart: unless-stopped
network_mode: host
volumes:
- ./data/turnserver.conf:/etc/coturn/turnserver.conf:ro
command: ["-c", "/etc/coturn/turnserver.conf", "--no-cli", "-v"]
Der Hostname sollte auf deine Domain zeigen. DNS-Eintrag nicht vergessen.

⚙️ Konfiguration des TURN Servers
Im Ordner data kommt die turnserver.conf:
realm=techniverse.net server-name=turn1.techniverse.net listening-ip=0.0.0.0 listening-ip=:: listening-port=3478 lt-cred-mech user=appuser:ReplaceWithStrongPassword123 min-port=49160 max-port=49200 external-ip=203.0.113.5/2001:db8:dead:beef::5 no-tls no-dtls fingerprint verbose
Wichtig:
- Realm und Server-Name anpassen
- Benutzer und Passwort anpassen
- externe IP muss die öffentliche Serveradresse sein
- IPv6 Zeilen löschen, wenn du keins nutzt
▶️ Start und Test
Starten:
docker compose up -d docker compose logs -f

Nach Eintragen der Zugangsdaten in der Zielanwendung lief die Verbindung sofort stabil. Keine Abbrüche mehr. Kein Glücksspiel mit externen Relays.
🧠 Mein Fazit
Der selbst gehostete TURN Server war am Ende weniger Aufwand als das Debugging eines fremden Dienstes. Sobald deine Anwendung zuverlässig funktionieren muss, lohnt sich das selbst hosten praktisch immer.
Du brauchst keine große Infrastruktur. Ein kleiner VPS reicht völlig.
Und das Beste: Seitdem habe ich Ruhe.
👥 Techniverse Community
Lust auf Austausch rund um Matrix, Selfhosting und andere smarte IT-Lösungen?
In der Techniverse Community triffst du Gleichgesinnte, kannst Fragen stellen oder einfach nerdigen Talk genießen. 🚀
👉 Jetzt der Gruppe auf Matrix beitreten
~ Direkte Raumadresse: #community:techniverse.net
👉 Für lockere Gespräche abseits der Kernthemen komm in den Talkraum
~ Direkte Raumadresse: #talk:techniverse.net
Wir freuen uns, wenn du dabei bist!



